From 1b8d0b88241100f67f7cd4c7e07f881c9fd3844e Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Wed, 10 Aug 2005 08:44:58 +0000 Subject: [PATCH] Initialize the xenstore MFN for VMX domains Signed-off-by: Arun Sharma Signed-off-by: Christian Limpach --- tools/libxc/linux_boot_params.h | 1 + tools/libxc/xc.h | 5 +- tools/libxc/xc_vmx_build.c | 101 ++++++++++++++++++------------ tools/python/xen/lowlevel/xc/xc.c | 24 +++---- tools/python/xen/xend/image.py | 18 +++++- 5 files changed, 94 insertions(+), 55 deletions(-) diff --git a/tools/libxc/linux_boot_params.h b/tools/libxc/linux_boot_params.h index 732d709c0a..fcc57e38e7 100644 --- a/tools/libxc/linux_boot_params.h +++ b/tools/libxc/linux_boot_params.h @@ -17,6 +17,7 @@ struct mem_map { #define E820_NVS 4 #define E820_IO 16 #define E820_SHARED 17 +#define E820_XENSTORE 18 u32 caching_attr; /* used by hypervisor */ #define MEMMAP_UC 0 diff --git a/tools/libxc/xc.h b/tools/libxc/xc.h index 5c82147c11..5cd61d9e20 100644 --- a/tools/libxc/xc.h +++ b/tools/libxc/xc.h @@ -306,7 +306,10 @@ int xc_vmx_build(int xc_handle, const char *ramdisk_name, const char *cmdline, unsigned int control_evtchn, - unsigned long flags); + unsigned long flags, + unsigned int vcpus, + unsigned int store_evtchn, + unsigned long *store_mfn); int xc_bvtsched_global_set(int xc_handle, unsigned long ctx_allow); diff --git a/tools/libxc/xc_vmx_build.c b/tools/libxc/xc_vmx_build.c index c56f3c442e..9836746919 100644 --- a/tools/libxc/xc_vmx_build.c +++ b/tools/libxc/xc_vmx_build.c @@ -37,58 +37,70 @@ static void build_e820map(struct mem_map *mem_mapp, unsigned long mem_size) int nr_map = 0; /* XXX: Doesn't work for > 4GB yet */ - mem_mapp->map[0].addr = 0x0; - mem_mapp->map[0].size = 0x9F800; - mem_mapp->map[0].type = E820_RAM; - mem_mapp->map[0].caching_attr = MEMMAP_WB; + mem_mapp->map[nr_map].addr = 0x0; + mem_mapp->map[nr_map].size = 0x9F800; + mem_mapp->map[nr_map].type = E820_RAM; + mem_mapp->map[nr_map].caching_attr = MEMMAP_WB; nr_map++; - mem_mapp->map[1].addr = 0x9F800; - mem_mapp->map[1].size = 0x800; - mem_mapp->map[1].type = E820_RESERVED; - mem_mapp->map[1].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = 0x9F800; + mem_mapp->map[nr_map].size = 0x800; + mem_mapp->map[nr_map].type = E820_RESERVED; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; - mem_mapp->map[2].addr = 0xA0000; - mem_mapp->map[2].size = 0x20000; - mem_mapp->map[2].type = E820_IO; - mem_mapp->map[2].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = 0xA0000; + mem_mapp->map[nr_map].size = 0x20000; + mem_mapp->map[nr_map].type = E820_IO; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; - mem_mapp->map[3].addr = 0xF0000; - mem_mapp->map[3].size = 0x10000; - mem_mapp->map[3].type = E820_RESERVED; - mem_mapp->map[3].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = 0xF0000; + mem_mapp->map[nr_map].size = 0x10000; + mem_mapp->map[nr_map].type = E820_RESERVED; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; - mem_mapp->map[4].addr = 0x100000; - mem_mapp->map[4].size = mem_size - 0x100000 - PAGE_SIZE; - mem_mapp->map[4].type = E820_RAM; - mem_mapp->map[4].caching_attr = MEMMAP_WB; +#define STATIC_PAGES 2 /* for ioreq_t and store_mfn */ + /* Most of the ram goes here */ + mem_mapp->map[nr_map].addr = 0x100000; + mem_mapp->map[nr_map].size = mem_size - 0x100000 - STATIC_PAGES*PAGE_SIZE; + mem_mapp->map[nr_map].type = E820_RAM; + mem_mapp->map[nr_map].caching_attr = MEMMAP_WB; nr_map++; - mem_mapp->map[5].addr = mem_size - PAGE_SIZE; - mem_mapp->map[5].size = PAGE_SIZE; - mem_mapp->map[5].type = E820_SHARED; - mem_mapp->map[5].caching_attr = MEMMAP_WB; + /* Statically allocated special pages */ + + /* Shared ioreq_t page */ + mem_mapp->map[nr_map].addr = mem_size - PAGE_SIZE; + mem_mapp->map[nr_map].size = PAGE_SIZE; + mem_mapp->map[nr_map].type = E820_SHARED; + mem_mapp->map[nr_map].caching_attr = MEMMAP_WB; + nr_map++; + + /* For xenstore */ + mem_mapp->map[nr_map].addr = mem_size - 2*PAGE_SIZE; + mem_mapp->map[nr_map].size = PAGE_SIZE; + mem_mapp->map[nr_map].type = E820_XENSTORE; + mem_mapp->map[nr_map].caching_attr = MEMMAP_WB; nr_map++; - mem_mapp->map[6].addr = mem_size; - mem_mapp->map[6].size = 0x3 * PAGE_SIZE; - mem_mapp->map[6].type = E820_NVS; - mem_mapp->map[6].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = mem_size; + mem_mapp->map[nr_map].size = 0x3 * PAGE_SIZE; + mem_mapp->map[nr_map].type = E820_NVS; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; - mem_mapp->map[7].addr = mem_size + 0x3 * PAGE_SIZE; - mem_mapp->map[7].size = 0xA * PAGE_SIZE; - mem_mapp->map[7].type = E820_ACPI; - mem_mapp->map[7].caching_attr = MEMMAP_WB; + mem_mapp->map[nr_map].addr = mem_size + 0x3 * PAGE_SIZE; + mem_mapp->map[nr_map].size = 0xA * PAGE_SIZE; + mem_mapp->map[nr_map].type = E820_ACPI; + mem_mapp->map[nr_map].caching_attr = MEMMAP_WB; nr_map++; - mem_mapp->map[8].addr = 0xFEC00000; - mem_mapp->map[8].size = 0x1400000; - mem_mapp->map[8].type = E820_IO; - mem_mapp->map[8].caching_attr = MEMMAP_UC; + mem_mapp->map[nr_map].addr = 0xFEC00000; + mem_mapp->map[nr_map].size = 0x1400000; + mem_mapp->map[nr_map].type = E820_IO; + mem_mapp->map[nr_map].caching_attr = MEMMAP_UC; nr_map++; mem_mapp->nr_map = nr_map; @@ -212,7 +224,11 @@ static int setup_guest(int xc_handle, unsigned long shared_info_frame, unsigned int control_evtchn, unsigned long flags, - struct mem_map * mem_mapp) + unsigned int vcpus, + unsigned int store_evtchn, + unsigned long *store_mfn, + struct mem_map *mem_mapp + ) { l1_pgentry_t *vl1tab=NULL, *vl1e=NULL; l2_pgentry_t *vl2tab=NULL, *vl2e=NULL; @@ -510,7 +526,10 @@ static int setup_guest(int xc_handle, boot_paramsp->drive_info.dummy[14] = 32; /* memsize is in megabytes */ + /* If you need to create a special e820map, comment this line + and use mem-map.sxp */ build_e820map(mem_mapp, memsize << 20); + *store_mfn = page_array[(v_end-2) >> PAGE_SHIFT]; #if defined (__i386__) if (zap_mmio_ranges(xc_handle, dom, l2tab, mem_mapp) == -1) #else @@ -637,7 +656,10 @@ int xc_vmx_build(int xc_handle, const char *ramdisk_name, const char *cmdline, unsigned int control_evtchn, - unsigned long flags) + unsigned long flags, + unsigned int vcpus, + unsigned int store_evtchn, + unsigned long *store_mfn) { dom0_op_t launch_op, op; int initrd_fd = -1; @@ -712,7 +734,8 @@ int xc_vmx_build(int xc_handle, initrd_gfd, initrd_size, nr_pages, ctxt, cmdline, op.u.getdomaininfo.shared_info_frame, - control_evtchn, flags, mem_mapp) < 0 ) + control_evtchn, flags, vcpus, store_evtchn, store_mfn, + mem_mapp) < 0 ) { ERROR("Error constructing guest OS"); goto error_out; diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 0756f656fc..517f1dd841 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -297,22 +297,23 @@ static PyObject *pyxc_vmx_build(PyObject *self, u32 dom; char *image, *ramdisk = NULL, *cmdline = ""; PyObject *memmap; - int control_evtchn, flags = 0; + int control_evtchn, store_evtchn; + int flags = 0, vcpus = 1; int numItems, i; int memsize; struct mem_map mem_map; + unsigned long store_mfn = 0; - static char *kwd_list[] = { "dom", "control_evtchn", - "memsize", - "image", "memmap", + static char *kwd_list[] = { "dom", "control_evtchn", "store_evtchn", + "memsize", "image", "memmap", "ramdisk", "cmdline", "flags", - NULL }; + "vcpus", NULL }; - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiisO!|ssi", kwd_list, - &dom, &control_evtchn, + if ( !PyArg_ParseTupleAndKeywords(args, kwds, "iiiisO!|ssii", kwd_list, + &dom, &control_evtchn, &store_evtchn, &memsize, &image, &PyList_Type, &memmap, - &ramdisk, &cmdline, &flags) ) + &ramdisk, &cmdline, &flags, &vcpus) ) return NULL; memset(&mem_map, 0, sizeof(mem_map)); @@ -321,7 +322,6 @@ static PyObject *pyxc_vmx_build(PyObject *self, /* get the number of lines passed to us */ numItems = PyList_Size(memmap) - 1; /* removing the line containing "memmap" */ - printf ("numItems: %d\n", numItems); mem_map.nr_map = numItems; /* should raise an error here. */ @@ -365,11 +365,11 @@ static PyObject *pyxc_vmx_build(PyObject *self, } if ( xc_vmx_build(xc->xc_handle, dom, memsize, image, &mem_map, - ramdisk, cmdline, control_evtchn, flags) != 0 ) + ramdisk, cmdline, control_evtchn, flags, + vcpus, store_evtchn, &store_mfn) != 0 ) return PyErr_SetFromErrno(xc_error); - Py_INCREF(zero); - return zero; + return Py_BuildValue("{s:i}", "store_mfn", store_mfn); } static PyObject *pyxc_bvtsched_global_set(PyObject *self, diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py index ded7b39184..608fe55c6b 100644 --- a/tools/python/xen/xend/image.py +++ b/tools/python/xen/xend/image.py @@ -274,14 +274,24 @@ class VmxImageHandler(ImageHandler): # Create an event channel self.device_channel = channel.eventChannel(0, self.vm.getDomain()) log.info("VMX device model port: %d", self.device_channel.port2) - return xc.vmx_build(dom = self.vm.getDomain(), + if self.vm.store_channel: + store_evtchn = self.vm.store_channel.port2 + else: + store_evtchn = 0 + ret = xc.vmx_build(dom = self.vm.getDomain(), image = self.kernel, control_evtchn = self.device_channel.port2, + store_evtchn = store_evtchn, memsize = self.vm.memory, memmap = self.memmap_value, cmdline = self.cmdline, ramdisk = self.ramdisk, - flags = self.flags) + flags = self.flags, + vcpus = self.vm.vcpus) + if isinstance(ret, dict): + self.vm.store_mfn = ret.get('store_mfn') + return 0 + return ret def parseMemmap(self): self.memmap = sxp.child_value(self.vm.config, "memmap") @@ -387,7 +397,9 @@ class VmxImageHandler(ImageHandler): (pid, status) = os.waitpid(self.pid, 0) def getDomainMemory(self, mem_mb): - return (mem_mb * 1024) + self.getPageTableSize(mem_mb) + # for ioreq_t and xenstore + static_pages = 2 + return (mem_mb * 1024) + self.getPageTableSize(mem_mb) + 4 * static_pages def getPageTableSize(self, mem_mb): """Return the size of memory needed for 1:1 page tables for physical -- 2.30.2